﻿#pragma once
#ifndef WRSTATEHANDLERS_H
#define WRSTATEHANDLERS_H

#include "../Structs/WRObservers.h"
#include "WRStateSource.h"

//表示状态处理器集合。
template <class T>
class WRStateHandlers : public WRObservers<WRStateHandler>, public WRStateSource
{
protected:
    //状态内容。
    T m_value;
    //是否有内容。
    bool m_hasValue;

    //当指定的观察者添加后调用此方法。
    void onAdded(Observer observer)
    {
        if (m_hasValue)
        {
            observer->doProcess(&m_value);
        }
    }

public:
    //构造函数。
    WRStateHandlers() : m_hasValue(false)
    {
        //add code here
    }
    //构造函数。
    explicit WRStateHandlers(const T& value) : m_value(value), m_hasValue(true)
    {
        //add code here
    }

    //获取当前值。
    inline void value(T& value) const
    {
        value = m_value;
    }
    //获取当前值。
    inline const T& value(void) const
    {
        return m_value;
    }

    //判断当前是否有值。
    inline bool hasValue(void) const
    {
        return m_hasValue;
    }

    //当状态改变后调用此方法。
    void doProcess(const T& value)
    {
        QMutexLocker lock(&m_mutex);
        for(WRu i = 0; i < m_count; ++i)
        {
            m_array[i]->doProcess(&value);
        }
        m_value = value;
        m_hasValue = true;
    }
    //当状态改变后调用此方法。
    void doProcess(const T* value)
    {
        QMutexLocker lock(&m_mutex);
        for(WRu i = 0; i < m_count; ++i)
        {
            m_array[i]->doProcess(value);
        }
        m_value = *value;
        m_hasValue = true;
    }

    //获取当前状态值，如果获取成功，返回True，否则返回False。
    bool current(T& value) const
    {
        QMutexLocker lock(&m_mutex);
        if(m_hasValue)
        {
            value = m_value;
            return true;
        }
        return false;
    }
    //获取当前状态值，如果获取成功，返回True，否则返回False。
    bool current(T* value) const
    {
        QMutexLocker lock(&m_mutex);
        if(m_hasValue)
        {
            *value = m_value;
            return true;
        }
        return false;
    }

private:
    //添加状态处理者。
    void addHandler(WRStateHandler* handler)
    {
        add(handler);
    }
    //移除状态处理者。
    bool removeHandler(WRStateHandler* handler)
    {
        return remove(handler);
    }
};

#endif // WRSTATEHANDLERS_H

